11 http://acm.uva.es/p/v1/107.html
13 Fecha: 26/Febrero/2007
15 GT = Gatos trabajadores
16 GNT = Gatos no trabajadores
19 bool isValidN(const int &N
, const int &filas
, const int &alturaGatoInicial
){
20 int tempAltura
= alturaGatoInicial
;
21 for (int i
=0; i
< (filas
-1); i
++){
22 if (tempAltura
% (N
+ 1) != 0) return false; //si no es divisible retorna falso
23 tempAltura
/= (N
+ 1);
31 int encontrarN(const int &numeroGatosTrabajadores
, const int &alturaGatoInicial
, int &SetFilas
){
32 //if (numeroGatosTrabajadores == 1) return 1;
35 while (posible
<= numeroGatosTrabajadores
){
37 while (temp
< numeroGatosTrabajadores
){
38 temp
= temp
* posible
;
42 //cout << "filas: " << filas << endl;
44 if (temp
== numeroGatosTrabajadores
){
45 if (isValidN(posible
, filas
, alturaGatoInicial
)){
52 return 0; //En teoria nunca debería pasar
55 int potenciar(const int &base
, const int &exponente
){
57 for (int i
=0; i
<exponente
; i
++) {
58 result
= result
* base
;
63 int getGNT(const int &N
, const int &filas
){
65 if (filas
== 1) return 0;
66 for (int i
=1; i
<(filas
-1); i
++){
67 result
+= potenciar(N
, i
);
72 int getSumaAlturas(const int &N
, const int &filas
, int alturaPrimerGato
){
74 int suma
= alturaPrimerGato
;
76 for (int i
=1; i
<filas
; i
++){
77 alturaPrimerGato
/= (N
+1);
78 suma
+= potenciar(N
, i
) * alturaPrimerGato
;
84 int main(int argc
, char *argv
[])
91 while (cin
>> alturaPrimerGato
&& cin
>> numeroGT
){
92 if (alturaPrimerGato
== 0 && numeroGT
== 0) break;
94 //cout << "N: " << encontrarN(numeroGT, alturaPrimerGato, filas) << endl;
95 //cout << "filas: " << filas << endl;
96 N
= encontrarN(numeroGT
, alturaPrimerGato
, filas
);
97 cout
<< getGNT(N
, filas
) << " " << getSumaAlturas(N
, filas
, alturaPrimerGato
) << endl
;